#pragma once

#include <glm\glm.hpp>
#include <glm\gtc\matrix_transform.hpp>


// Se definen algunas cosas que se usan en todas las camaras
enum class TIPO_CAMARA { PRIMERA_PERSONA, VISTA_GRUA, VISTA_AEREA };
enum class MOVE_TYPE { ADELANTE=0, ATRAS, DERECHA, IZQUIERDA };
enum class ZOOM_TYPE { ZOOM_IN=1, ZOOM_OUT=-1, ZOOM_NONE=0 };


class Camara {
public:
	Camara(unsigned int alto, unsigned int ancho, float fov);
	virtual ~Camara();

	virtual void init(const glm::vec3 &posicion, const glm::vec3 &target, const glm::vec3 &up);

	virtual const glm::mat4 getViewMatrix() const;
	virtual const glm::mat4 getProjectMatrix() const;

	virtual void zoomIn(ZOOM_TYPE z) = 0;
	virtual void mouseMove(int viewportPosX, int viewportPosY) = 0;
	virtual void moverCamara(MOVE_TYPE direccion, float magnitud) = 0;

protected:
	// Los elementos que definen la perspectiva
	float m_fov;
	const int m_alto;
	const int m_ancho;

	// Los elementos que definen la vista
	glm::vec3 m_vecUp;
	glm::vec3 m_vecTarget;
	glm::vec3 m_vecPosicion;

	// Las matrices de vista y de proyeccion
	glm::mat4 m_matVista;
	glm::mat4 m_matProyeccion;

	void actualizarMatrizVista();
	void actualizarMatrizProyeccion();
};

